package LeetCode75;

import java.util.Arrays;

/**
 * 1657. 确定两个字符串是否接近
 * 如果可以使用以下操作从一个字符串得到另一个字符串，则认为两个字符串 接近 ：
 *
 * 操作 1：交换任意两个 现有 字符。
 * 例如，abcde -> aecdb
 * 操作 2：将一个 现有 字符的每次出现转换为另一个 现有 字符，并对另一个字符执行相同的操作。
 * 例如，aacabb -> bbcbaa（所有 a 转化为 b ，而所有的 b 转换为 a ）
 * 你可以根据需要对任意一个字符串多次使用这两种操作。
 *
 * 给你两个字符串，word1 和 word2 。如果 word1 和 word2 接近 ，就返回 true ；否则，返回 false 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：word1 = "abc", word2 = "bca"
 * 输出：true
 * 解释：2 次操作从 word1 获得 word2 。
 * 执行操作 1："abc" -> "acb"
 * 执行操作 1："acb" -> "bca"
 * 示例 2：
 *
 * 输入：word1 = "a", word2 = "aa"
 * 输出：false
 * 解释：不管执行多少次操作，都无法从 word1 得到 word2 ，反之亦然。
 * 示例 3：
 *
 * 输入：word1 = "cabbba", word2 = "abbccc"
 * 输出：true
 * 解释：3 次操作从 word1 获得 word2 。
 * 执行操作 1："cabbba" -> "caabbb"
 * 执行操作 2："caabbb" -> "baaccc"
 * 执行操作 2："baaccc" -> "abbccc"
 * 示例 4：
 *
 * 输入：word1 = "cabbba", word2 = "aabbss"
 * 输出：false
 * 解释：不管执行多少次操作，都无法从 word1 得到 word2 ，反之亦然。
 *
 *
 * 提示：
 *
 * 1 <= word1.length, word2.length <= 105
 * word1 和 word2 仅包含小写英文字母
 */
public class T1657_确定两个字符串是否接近 {

    //两个字符串接近的必要条件 1 长度相等 2 出现的字符两者必须都有 3 字符频率相等(不同字符的频率 频率排序后完全一致)
    public boolean closeStrings(String word1, String word2) {


        //1 长度相等
        if (word1.length() != word2.length()) {
            return false;
        }

        int[] word1Count = new int[26];
        int[] word2Count = new int[26];

        for (int i = 0; i < word1.length(); i++) {
            word1Count[word1.charAt(i) - 'a']++;
            word2Count[word2.charAt(i) - 'a']++;
        }
//2 出现的字符两者必须都有
        for (int i = 0; i < word1Count.length; i++) {
            if (word1Count[i] == 0 && word2Count[i] != 0) {
                return false;
            }
            if (word1Count[i] != 0 && word2Count[i] == 0) {
                return false;
            }
        }

//        3 字符频率相等(不同字符的频率 频率排序后完全一致)
        Arrays.sort(word1Count);
        Arrays.sort(word2Count);

        for (int i = 0; i < word1Count.length; i++) {
            if (word1Count[i] != word2Count[i]) {
                return false;
            }
        }

        return true;


    }

}
